#include <ntddk.h>

VOID OnUnload(PDRIVER_OBJECT pDriverObj)
{
     DbgPrint("\nDriver Exited\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegisteryPath)
{
         PUCHAR pInitialPtr, pCurrentPtr;
         PULONG pKiWaitListHead;
         
         size_t i;
         
         
         pInitialPtr = (PUCHAR)KeWaitForSingleObject;
         pCurrentPtr = pInitialPtr;
         DbgPrint("\nKeWaitForSignleObject Address : 0x%x\n", pInitialPtr);
         
         for(i = 0; i < 50000; i++)
         {
                      if(*((PUCHAR)pCurrentPtr-0x3) == 0x8D && *(PUCHAR)pCurrentPtr == 0xC7 && *((PUCHAR)pCurrentPtr+0x6) == 0x89 && *((PUCHAR)pCurrentPtr+0x9) == 0x89)// && *((PUCHAR)pCurrentPtr+0x10) == 0xD1  && *((PUCHAR)pCurrentPtr+0x11) == 0x72)
                                              break;
                      //DbgPrint("\n+0x%x  0x%x  \n", pCurrentPtr-pInitialPtr, *(PUCHAR)pCurrentPtr);
                      
                      pCurrentPtr += 0x1;
         }

         pKiWaitListHead = (PULONG)*(PULONG)((PUCHAR)pCurrentPtr + 0x2);
         DbgPrint("\n\nKiWaitListHead Address : 0x%x", pKiWaitListHead);
         
         pDriverObj->DriverUnload = OnUnload;
         
         return STATUS_SUCCESS;
}
